{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import tensorflow as tf\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'1.13.1'"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tf.__version__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 构建单层多神经元模型\n",
    "\n",
    "from tensorflow.examples.tutorials.mnist import input_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-4-d68367e32ec5>:2: read_data_sets (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "WARNING:tensorflow:From /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:260: maybe_download (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please write your own downloading logic.\n",
      "WARNING:tensorflow:From /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:262: extract_images (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "WARNING:tensorflow:From /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:267: extract_labels (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n",
      "WARNING:tensorflow:From /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:290: DataSet.__init__ (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n"
     ]
    }
   ],
   "source": [
    "# mnist = input_data.read_data_sets(\"./AI_14_第七周_周胜航\", one_hot=True)\n",
    "mnist = input_data.read_data_sets(\".\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'mnist' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-1-33a4587201e5>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmnist\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mimages\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      2\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmnist\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlabels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmnist\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalidation\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mimages\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmnist\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalidation\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlabels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mNameError\u001b[0m: name 'mnist' is not defined"
     ]
    }
   ],
   "source": [
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 8))\n",
    "for idx in range(16):\n",
    "    plt.subplot(4, 4, idx+1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(mnist.train.labels[idx]))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28,28)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 初始化, 高斯分布\n",
    "def initialize(shape, stddev=0.1):\n",
    "    return tf.truncated_normal(shape, stddev=0.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 3个根据batch填入的，用placeholder占位\n",
    "# 制定学习率\n",
    "learning_rate = tf.placeholder(tf.float32)\n",
    "# 16半精度，64双精度，比较耗费资源\n",
    "\n",
    "# none:batch size, 784是图片张图，28*28, name 在图里查找变量\n",
    "x = tf.placeholder(tf.float32, [None, 784], name='x')\n",
    "\n",
    "# label\n",
    "y = tf.placeholder(tf.int64, [None], name='y')\n",
    "\n",
    "\n",
    "# # 初始化, 高斯分布\n",
    "# def initialize(shape, stddev=0.1):\n",
    "#     return tf.truncated_normal(shape, stddev=0.1)\n",
    "\n",
    "\n",
    "# 第一层神经元个数\n",
    "L1_units_count = 100\n",
    "# 权重矩阵\n",
    "W_1 = tf.Variable(initialize([784, L1_units_count]))\n",
    "# 偏置\n",
    "b_1 = tf.Variable(initialize([L1_units_count]))\n",
    "# 计算激活前的值\n",
    "logits_1 = tf.matmul(x, W_1) + b_1\n",
    "# 激活\n",
    "output_1 = tf.nn.relu(logits_1)\n",
    "\n",
    "\n",
    "# 第二层神经元个数\n",
    "L2_units_count = 10\n",
    "# 权重矩阵\n",
    "W_2 = tf.Variable(initialize([L1_units_count, L2_units_count]))\n",
    "# 偏置\n",
    "b_2 = tf.Variable(initialize([L2_units_count]))\n",
    "# 计算激活前的值\n",
    "logits_2 = tf.matmul(output_1, W_2) + b_2\n",
    "\n",
    "logits = logits_2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义交叉熵损失loss计算使用了\n",
    "# sparse_softmax_cross_entropy_with_logits, 这样做的好处是labels可以不用手动做one_hot省了一些麻烦。\n",
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=y))  # 此处由于没有转化为概率，为整形\n",
    "\n",
    "# 定义优化器\n",
    "optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(cross_entropy_loss)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 调整为概率\n",
    "pred = tf.nn.softmax(logits)\n",
    "\n",
    "# 准确率\n",
    "corr_pred = tf.equal(tf.arg_max(pred, 1), y)\n",
    "accuracy = tf.reduce_mean(tf.cast(corr_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "saver用于保存和恢复模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 32\n",
    "training_step = 3000\n",
    "\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.263306, the validation accuracy is 0.8798\n",
      "after 200 training steps, the loss is 0.251369, the validation accuracy is 0.9076\n",
      "after 300 training steps, the loss is 0.386156, the validation accuracy is 0.9216\n",
      "after 400 training steps, the loss is 0.498727, the validation accuracy is 0.9026\n",
      "after 500 training steps, the loss is 0.372233, the validation accuracy is 0.9426\n",
      "after 600 training steps, the loss is 0.345758, the validation accuracy is 0.9402\n",
      "after 700 training steps, the loss is 0.0815372, the validation accuracy is 0.9456\n",
      "after 800 training steps, the loss is 0.389798, the validation accuracy is 0.9512\n",
      "after 900 training steps, the loss is 0.379531, the validation accuracy is 0.9404\n",
      "after 1000 training steps, the loss is 0.2506, the validation accuracy is 0.9526\n",
      "after 1100 training steps, the loss is 0.0855173, the validation accuracy is 0.954\n",
      "after 1200 training steps, the loss is 0.180231, the validation accuracy is 0.9534\n",
      "after 1300 training steps, the loss is 0.21482, the validation accuracy is 0.9552\n",
      "after 1400 training steps, the loss is 0.0383278, the validation accuracy is 0.9606\n",
      "after 1500 training steps, the loss is 0.117792, the validation accuracy is 0.963\n",
      "after 1600 training steps, the loss is 0.0164582, the validation accuracy is 0.9636\n",
      "after 1700 training steps, the loss is 0.0731882, the validation accuracy is 0.9616\n",
      "after 1800 training steps, the loss is 0.100466, the validation accuracy is 0.9642\n",
      "after 1900 training steps, the loss is 0.0388049, the validation accuracy is 0.968\n",
      "after 2000 training steps, the loss is 0.0849218, the validation accuracy is 0.9662\n",
      "after 2100 training steps, the loss is 0.0520386, the validation accuracy is 0.9644\n",
      "after 2200 training steps, the loss is 0.0480725, the validation accuracy is 0.9676\n",
      "after 2300 training steps, the loss is 0.0692074, the validation accuracy is 0.9702\n",
      "after 2400 training steps, the loss is 0.0378252, the validation accuracy is 0.9644\n",
      "after 2500 training steps, the loss is 0.0513052, the validation accuracy is 0.9668\n",
      "after 2600 training steps, the loss is 0.228902, the validation accuracy is 0.9678\n",
      "after 2700 training steps, the loss is 0.116041, the validation accuracy is 0.9682\n",
      "after 2800 training steps, the loss is 0.047569, the validation accuracy is 0.9644\n",
      "after 2900 training steps, the loss is 0.176987, the validation accuracy is 0.97\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.9609\n"
     ]
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels}\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels}\n",
    "\n",
    "    for i in range(training_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss = sess.run(\n",
    "            [optimizer, cross_entropy_loss],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                learning_rate: 0.3\n",
    "            })\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-2900\n",
      "0.9375\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 检测\n",
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('.')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16]\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(mnist.test.labels[idx],\n",
    "                                                  order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 模型结构\n",
    "模型结构用了一层隐层，100个神经元。输出层10个神经元作输出。高斯初始化，ReLU激活，SGD优化算法，损失函数选择交叉熵损失，每次输入32个数据进行计算\n",
    "\n",
    "### 模型训练过程\n",
    "每一个step表示前向，反向计算，参数更新一次，训练迭代1K次\n",
    "每次迭代从训练样本中抽取一个batch_size的样本进行训练。\n",
    "前向传播，训练SGD优化器得到损失值。\n",
    "反向传播，根据损失值和学习率进行参数更新。\n",
    "每100次训练打印一次损失值与验证准确率并保存模型。\n",
    "\n",
    "### 图的理解\n",
    "- 计算图\n",
    "    图只表示运算过程，并没有运算结果。图中的结点由指针变量指向它\n",
    "- 会话\n",
    "    会话的作用是处理内存分配和优化，使我们能够实际执行由图形指定的计算。\n",
    "    可以将计算图想象为我们想要执行的计算的“模板”：它列出了所有的步骤。\n",
    "    为了使用这个图表，我们还需要发起一个会话，它使我们能够实际地完成任务。\n",
    "    例如，遍历模板的所有节点来分配一组用于存储计算输出的存储器。为了使用 Tensorflow 进行各种计算，我们既需要图也需要会话。\n",
    "    会话包含一个指向全局图的指针，该指针通过指向所有节点的指针不断更新。\n",
    "    这意味着在创建节点之前还是之后创建会话都无所谓。\n",
    "    创建会话对象后，可以使用 sess.run(node) 返回节点的值，并且 Tensorflow 将执行确定该值所需的所有计算。\n",
    "    一般来说，sess.run() 调用往往是最大的 TensorFlow 瓶颈之一，所以调用它的次数越少越好。\n",
    "    可以的话在一个 sess.run() 调用中返回多个项目，而不是进行多个调用。\n",
    "- 优点\n",
    "    可以节约系统开销；\n",
    "    有利于提取中间结果；\n",
    "    对分布式友好；\n",
    "    \n",
    "### 模型不好的原因\n",
    "模型结果不好的原因有很多，学习率，初始化，神将网络结构，优化算法都可以改变。激活函数试过，其他的不如ReLU。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
